[GitHub]ActionsのContextを効率よく確認しつつjqとset-envを用いて再定義してみた

[GitHub]ActionsのContextを効率よく確認しつつjqとset-envを用いて再定義してみた

GitHub Actionsにて状況に応じたデータを取る際に避けられない、各contextの扱い方や加工手段等、備忘録兼ねてまとめました。
Clock Icon2020.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Actionsのワークフローでrunenvに渡すパラメータにContextを使いたい時に、出力確認方法が実際に動かすしかなく、色々と不便に思うことがあります。

公式ドキュメントを読んでみても正直分かり辛いことが多かったため、質疑応答フォーラムを検索したり、地道にDump等を繰り返して、わかってきたことを備忘録としてまとめました。

Contextの呼び出し

githubenvjobstepsrunnerの5つがあり、

  • commit内容を取りたいときにはgithubからデータを引く
  • workflowのステータスを取りたいときにはstepsからデータを引く

等の使い分けが必要です。データ構成の詳細は公式ドキュメントにまとまっていますが、実際の出力については自身で試す必要があります。

Context and expression syntax for GitHub Actions - GitHub ヘルプ

Contextの確認

手っ取り早く確認したい時は、ContextをダンプさせるだけのWorkflowを作成し、必要に応じてKeyの組み合わせを確認するという手があります。

name: context_dump
on:
  push:
    branches:
      - context_dump
jobs:
  dump:
    runs-on: ubuntu-latest
    steps:
      - name: dump context
        run: echo '${{ toJSON(github) }}'

気をつけるべき点として、このケースではPushイベント時の発火としていますが、WebhookのPushEvent Payloadとは構成が異なります。

Contextの加工

runで実行するコマンドの引数用にコミットハッシュ先頭7文字を渡したい」

といった場合には、toJson()を通し、ホストランナーにインストールされているjqを用いてArray/String Sliceにて削る、などの対応が必要になります。Contextにて利用可能な関数はformat()join()等の結合が主で、スライスが出来ません。

$(echo '${{ toJSON(github) }}' | jq -r ".sha[0:7]")

使いまわしたい場合は、set-envにて指定する方法もあります。

Workflow commands for GitHub Actions - GitHub Help

- name: define hash
  run: echo ::set-env name=SHORTHASH::$(echo '${{ toJSON(github) }}' | jq -r ".sha[0:7]")
- name: Test
  run: echo $SHORTHASH

Branch名がref/heads/****となっているために使いにくいと感じる場合には、以下のようにheads/以前を削除した形で再定義も可能です。

- name: define branchname
  run: echo ::set-env name=SHORTBRANCH::$(eco '${{ toJSON(github) }}' | jq -r ".ref[11:]")
- name: Test
  run: echo $SHORTBRANCH

あとがき

最初、ContextはWebhookのPayload構成と同一だと思いこんでおり、Dumpしてみて初めて異なることに気が付きました。

Contextもset-envを知るまでは長いvalueをそのまま使ったりしていましたが、ドキュメントを読んで理解してしまうことでWorkflow内で完結できることが増えて色々楽になると思います。

ただ、ドキュメントを探しあてるのが一番大変かもしれません。困った時は比較的事例が多いと思われるStackOverFlowで検索してみることもおすすめします。

Posts containing 'github actions' - Stack Overflow

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.